package cn.spdb.harrier.server.master.deal;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;

import cn.spdb.harrier.common.utils.Stopper;
import cn.spdb.harrier.server.entity.JobExecutionContext;
import cn.spdb.harrier.server.master.MasterManagerService;

public class SelfStreamJobDeal implements Runnable, Deal {

	private final AtomicBoolean STOP = new AtomicBoolean(false);
	private MasterManagerService masterService;

	private LinkedBlockingQueue<JobExecutionContext> selfStreamQueue = new LinkedBlockingQueue<JobExecutionContext>();

/**
 * 自触发任务处理线程的主方法。
 *
 * <p>该方法是一个无限循环，持续从阻塞队列中取出待处理的任务上下文，
 * 并调用 {@link MasterManagerService#selfStream(JobExecutionContext)} 方法，
 * 用于处理当前任务的自触发逻辑（即任务自身根据批次或日期自动触发下一次执行）。
 *
 * <h3>主要流程如下：</h3>
 * <ul>
 *   <li>检查是否被暂停（STOP 标志）</li>
 *   <li>如果被暂停，则休眠一段时间后继续等待</li>
 *   <li>从队列中取出一个任务上下文</li>
 *   <li>调用 selfStream 方法处理自触发逻辑</li>
 * </ul>
 */
@Override
public void run() {
    // 主循环：只要系统未停止就一直运行
    while (Stopper.isRunning()) {
        try {
            // 如果当前线程被暂停（STOP 为 true），则休眠 10 秒后继续等待
            if (STOP.get()) {
                Thread.sleep(1000 * 10);
                continue;
            }

            // 从阻塞队列中取出一个任务上下文（若队列为空会阻塞直到有新任务加入）
            JobExecutionContext jobContext = selfStreamQueue.take();

            // 调用 masterService 的 selfStream 方法处理自触发逻辑
            masterService.selfStream(jobContext);
        } catch (InterruptedException e) {
            // 捕获中断异常并打印堆栈信息
            e.printStackTrace();
        }
    }
}


	public void stop() {
		STOP.set(true);
		selfStreamQueue.clear();
	}

	public void start() {
		STOP.set(false);
	}

	public void addQueue(JobExecutionContext jobContext) {
		selfStreamQueue.offer(jobContext);
	}

	public SelfStreamJobDeal(MasterManagerService masterService) {
		super();
		this.masterService = masterService;
	}

}
